---
title: Operations and processes
summary: End-to-end processing workflows and operation catalog for OnBaseKeywordSync.
status: draft
owner: Documents
last_reviewed: 2026-09-17
---

# Operations and processes

All operations belong to the **Execute** lifecycle stage; `Initialize` and `Finish` are empty, so no operation maps to them. This page is the operation catalog and hub; each operation's detailed, step-by-step logic lives in its own page under `operations/`.

## Operation catalog

| ID | Operation | Trigger | Lifecycle stage | Owning component | Rules |
| --- | --- | --- | --- | --- | --- |
| [OP-001](operations/run-the-onbase-keyword-sync.md) | Run the OnBase keyword sync | `ConsoleBase.Run()` after `Initialize()` returns and `Environment.ExitCode` is set to `0`† | Execute | `OnBaseKeywordSyncRunner.Execute` | [BR-OBKS-001](business-rules.md#br-obks-001-asynchronous-or-synchronous-update-mode), [BR-OBKS-002](business-rules.md#br-obks-002-invalid-person-keyword-syncs-cleared-before-the-batch), [BR-OBKS-003](business-rules.md#br-obks-003-unprocessed-records-processed-in-ascending-id-order) |
| [OP-002](operations/clear-invalid-person-keyword-syncs.md) | Clear invalid person keyword syncs | Step 4 of OP-001 | Execute | `OnBaseKeywordSyncRunner.ProcessInvalidKeywordSyncs` / `ImagingApiClient.ProcessInavlidPersonKeywordSyncs` | [BR-OBKS-002](business-rules.md#br-obks-002-invalid-person-keyword-syncs-cleared-before-the-batch) |
| [OP-003](operations/sync-a-keyword-batch-with-onbase.md) | Sync a keyword batch with OnBase | Step 7 of OP-001, via `OnBaseKeywordSyncRunner.SyncDataWithOnBase` | Execute | `KeywordUpdater.Update` | [BR-OBKS-003](business-rules.md#br-obks-003-unprocessed-records-processed-in-ascending-id-order), [BR-OBKS-004](business-rules.md#br-obks-004-document-count-gates-whether-a-record-is-sent), [BR-OBKS-005](business-rules.md#br-obks-005-equal-prior-and-new-values-are-not-sent), [BR-OBKS-006](business-rules.md#br-obks-006-trigger-type-and-query-keyword-derived-by-precedence), [BR-OBKS-009](business-rules.md#br-obks-009-flag-keyword-translation), [BR-OBKS-010](business-rules.md#br-obks-010-every-record-marked-processed-after-its-update-set-completes) |
| [OP-004](operations/decide-whether-a-record-is-sent-to-onbase.md) | Decide whether a record is sent to OnBase | Step 3 of OP-003 | Execute | `KeywordUpdater.PerformUpdate` | [BR-OBKS-004](business-rules.md#br-obks-004-document-count-gates-whether-a-record-is-sent), [BR-OBKS-005](business-rules.md#br-obks-005-equal-prior-and-new-values-are-not-sent), [BR-OBKS-006](business-rules.md#br-obks-006-trigger-type-and-query-keyword-derived-by-precedence), [BR-OBKS-009](business-rules.md#br-obks-009-flag-keyword-translation) |
| [OP-005](operations/send-one-keyword-update-to-onbase.md) | Send one keyword update to OnBase | Step 4 of OP-003 | Execute | `OnBaseKeywordSyncClient.UpdateKeyword` | [BR-OBKS-001](business-rules.md#br-obks-001-asynchronous-or-synchronous-update-mode), [BR-OBKS-006](business-rules.md#br-obks-006-trigger-type-and-query-keyword-derived-by-precedence), [BR-OBKS-007](business-rules.md#br-obks-007-empty-new-value-applied-as-keyword-deletion), [BR-OBKS-008](business-rules.md#br-obks-008-custom-query-selected-from-doc-type-group-mapping), [BR-OBKS-009](business-rules.md#br-obks-009-flag-keyword-translation), [BR-OBKS-011](business-rules.md#br-obks-011-onbase-calls-throttled-by-a-sleep-interval) |
| [OP-006](operations/translate-a-keyword-value.md) | Translate a keyword value | Step 1 of OP-004 and step 4 of OP-005 | Execute | `KeywordHelper.GetKeywordValue` | [BR-OBKS-009](business-rules.md#br-obks-009-flag-keyword-translation) |

## Cross-operation flow diagram

The following diagram visualizes how the operations sequence across the run lifecycle.

```mermaid
flowchart TD
    A["OP-001: Run the OnBase<br>keyword sync"] --> B["OP-002: Clear invalid<br>person keyword syncs"]
    B --> C["Retrieve unprocessed<br>keyword syncs, ordered by Id"]
    C --> D["OP-003: Sync a keyword<br>batch with OnBase"]
    D --> E["OP-004: Decide whether<br>a record is sent"]
    E -->|Send| F["OP-006: Translate<br>keyword value"]
    F --> G["OP-005: Send one keyword<br>update to OnBase"]
    E -->|Skip| H["Log skip reason"]
    G --> I["Mark record processed<br>in Imaging API"]
    H --> I
    I -->|Any exception| J["Rethrow -&gt; exit code 5"]
```

## Related documentation
- [Application index](index.md)
- [Overview](overview.md)
- [Architecture](architecture.md)
- [Run lifecycle](run-lifecycle.md)
- [Arguments](arguments.md)
- [Dependencies](dependencies.md)
- [Configuration](configuration.md)
- [Business rules](business-rules.md)
- [Operational runbook](operational-runbook.md)
- [Tech debt](tech-debt.md)

## Sources
- `OnBaseKeywordSync/OnBaseKeywordSyncRunner.cs`
- `OnBaseKeywordSync/Services/ImagingApiClient.cs`
- `OnBaseKeywordSync/Services/KeywordUpdater.cs`
- `OnBaseKeywordSync/Services/OnBaseKeywordSyncClient.cs`
- `OnBaseKeywordSync/Services/KeywordHelper.cs`
